home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
Pakiet bezpieczenstwa
/
mini Pentoo LiveCD 2006.1
/
mpentoo-2006.1.iso
/
livecd.squashfs
/
usr
/
lib
/
python2.4
/
site-packages
/
impacket
/
dcerpc
/
srvsvc.py
< prev
next >
Wrap
Text File
|
2006-05-23
|
8KB
|
273 lines
# Copyright (c) 2003-2006 CORE Security Technologies
#
# This software is provided under under a slightly modified version
# of the Apache Software License. See the accompanying LICENSE file
# for more information.
#
# $Id: srvsvc.py,v 1.2 2006/05/23 21:19:26 gera Exp $
#
# Description:
# SRVSVC interface implementation.
#
import array
from struct import *
import exceptions
from impacket import ImpactPacket
import dcerpc
import ndrutils
MSRPC_UUID_SRVSVC = '\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x03\x00\x00\x00'
class SRVSVCNetShareGetInfoHeader(ImpactPacket.Header):
OP_NUM = 0x10
__SIZE = 32
def __init__(self, aBuffer = None):
ImpactPacket.Header.__init__(self, SRVSVCNetShareGetInfoHeader.__SIZE)
self._set_shalen(0)
self._set_serlen(0)
self.set_server_referent_id(0x0011bf74)
self.set_server_max_count(0)
self.set_server_offset(0)
self.set_server_actual_count(0)
self.set_server('')
self.set_share_max_count(0)
self.set_share_offset(0)
self.set_share_actual_count(0)
self.set_share('')
self.set_info_level(0)
if aBuffer: self.load_header(aBuffer)
def get_server_referent_id(self):
return self.get_long(0, '<')
def set_server_referent_id(self, id):
self.set_long(0, id, '<')
def get_server_max_count(self):
return self.get_long(4, '<')
def set_server_max_count(self, count):
self.set_long(4, count, '<')
def get_server_offset(self):
return self.get_long(8, '<')
def set_server_offset(self, offset):
self.set_long(8, offset, '<')
def get_server_actual_count(self):
return self.get_long(12, '<')
def set_server_actual_count(self, count):
self.set_long(12, count, '<')
def set_server(self, name):
pad = ''
if len(name) % 4:
pad = '\0' * (4 - len(name) % 4)
name = name + pad
## 4 bytes congruency
self.get_bytes()[16:16 + len(name)] = array.array('B', name)
self._set_serlen(len(name))
def _set_serlen(self, len):
self._serlen = len
def _get_serlen(self):
return self._serlen
def _set_shalen(self, len):
self._shalen = len
def _get_shalen(self):
return self._shalen
def get_share_max_count(self):
server_max_count = self._get_serlen()
return self.get_long(16 + server_max_count, '<')
def set_share_max_count(self, count):
server_max_count = self._get_serlen()
self.set_long(16 + server_max_count, count, '<')
def get_share_offset(self):
server_max_count = self._get_serlen()
return self.get_long(20 + server_max_count, '<')
def set_share_offset(self, offset):
server_max_count = self._get_serlen()
self.set_long(20 + server_max_count, offset, '<')
def get_share_actual_count(self):
server_max_count = self._get_serlen()
return self.get_long(24 + server_max_count, '<')
def set_share_actual_count(self, count):
server_max_count = self._get_serlen()
self.set_long(24 + server_max_count, count, '<')
def set_share(self, share):
server_max_count = self._get_serlen()
pad = ''
if len(share) % 4:
pad = '\0' * (4 - len(share) % 4)
share = share + pad
self.get_bytes()[28 + server_max_count:28 + len(share)] = array.array('B', share)
self._set_shalen(len(share))
def get_info_level(self):
server_max_count = self._get_serlen()
share_max_count = self._get_shalen()
return self.get_long(28 + server_max_count + share_max_count, '<')
def set_info_level(self, level):
server_max_count = self._get_serlen()
share_max_count = self._get_shalen()
self.set_long(28 + server_max_count + share_max_count, level, '<')
def get_header_size(self):
server_max_count = self._get_serlen()
share_max_count = self._get_shalen()
return SRVSVCNetShareGetInfoHeader.__SIZE + server_max_count + share_max_count
class SRVSVCRespNetShareGetInfoHeader(ImpactPacket.Header):
__SIZE = 8
def __init__(self, aBuffer = None):
ImpactPacket.Header.__init__(self, SRVSVCRespNetShareGetInfoHeader.__SIZE)
if aBuffer: self.load_header(aBuffer)
def get_info_level(self):
return self.get_long(0, '<')
def set_info_level(self, level):
self.set_long(0, level, '<')
def set_share_info(self, info):
raise exceptions.Exception, "method not implemented"
def get_share_info(self):
level = self.get_info_level()
if level == 2:
return ndrutils.NDRPointer(self.get_bytes()[4:-4].tostring(), ShareInfoLevel2Entry)
else:
raise exceptions.Exception, "Share Info level not supported"
def get_return_code(self):
return self.get_long(len(self.get_bytes())-4, '<')
def get_header_size(self):
return len(self.get_bytes())
class ShareInfoLevel2Entry:
def __init__(self, data = ''):
self.set_netname(0)
self.set_remark(0)
self.set_path(0)
self.set_passwd(0)
if data:
p_netname, self._type, p_remark, self._permissions, self._max_uses, \
self._current_uses, p_path, p_passwd = unpack('<LLLLLLLL', data[: 8 * 4])
data = data[8 * 4:]
if p_netname:
self.set_netname(ndrutils.NDRString(data))
dlen = self.get_netname().get_max_len() * 2
pad = 0
if dlen % 4:
pad = 4 - dlen % 4
data = data[12 + dlen + pad:]
if p_remark:
self.set_remark(ndrutils.NDRString(data))
dlen = self.get_remark().get_max_len() * 2
pad = 0
if dlen % 4:
pad = 4 - dlen % 4
data = data[12 + dlen + pad:]
if p_path:
self.set_path(ndrutils.NDRString(data))
dlen = self.get_path().get_max_len() * 2
pad = 0
if dlen % 4:
pad = 4 - dlen % 4
data = data[12 + dlen + pad:]
if p_passwd:
self.set_passwd(ndrutils.NDRString(data))
dlen = self.get_passwd().get_max_len() * 2
pad = 0
if dlen % 4:
pad = 4 - dlen % 4
data = data[12 + dlen + pad:]
def set_netname(self, netname):
self._netname = netname
def get_netname(self):
return self._netname
def set_remark(self, remark):
self._remark = remark
def get_remark(self):
return self._remark
def set_path(self, path):
self._path = path
def get_path(self):
return self._path
def set_passwd(self, passwd):
self._passwd = passwd
def get_passwd(self):
return self._passwd
def get_type(self):
return self._type
def get_permissions(self):
return self._permissions
def get_max_uses(self):
return self._max_uses
def get_current_uses(self):
return self._current_uses
class DCERPCSrvSvc:
def __init__(self, dcerpc):
self._dcerpc = dcerpc
def get_share_info(self, server, share, level):
server += '\0'
share += '\0'
server = server.encode('utf-16le')
share = share.encode('utf-16le')
info = SRVSVCNetShareGetInfoHeader()
server_len = len(server)
share_len = len(share)
info.set_server_max_count(server_len / 2)
info.set_server_actual_count(server_len / 2)
info.set_server(server)
info.set_share_max_count(share_len / 2)
info.set_share_actual_count(share_len / 2)
info.set_share(share)
info.set_info_level(2)
self._dcerpc.send(info)
data = self._dcerpc.recv()
retVal = SRVSVCRespNetShareGetInfoHeader(data)
return retVal